<?php

App::import('Sanitize');

class PliegosController extends AppController {

    var $name = 'Pliegos';
    var $paginate = array(
        'recursive' => 0,
        'order' => array('Pliego.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //$this->Auth->allow();
    }

    function __mime_content_type($filename) {
        $mime_types = array(
            'txt' => 'text/plain',
            // archives
            'zip' => 'application/zip',
            'rar' => 'application/x-rar-compressed',
            // adobe
            'pdf' => 'application/pdf',
            // ms office
            'doc' => 'application/msword',
            'rtf' => 'application/rtf',
            'xls' => 'application/vnd.ms-excel',
            'ppt' => 'application/vnd.ms-powerpoint',
            // open office
            'odt' => 'application/vnd.oasis.opendocument.text',
            'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
        );

        $ext = strtolower(array_pop(explode('.', $filename)));
        if (array_key_exists($ext, $mime_types)) {
            return true;
        } else {
            return false;
        }
    }

    function add_pliego() {
        $this->__aux_add_pliego();
    }

    function admin_add_pliego() {
        $this->__aux_add_pliego();
    }

    /**
     * Permite dar de alta un pliego de una obra de arte
     */
    function __aux_add_pliego() {
        $this->layout = false;

        if ($this->Session->check('id_obra')) {
            $obra_id = $this->Session->read('id_obra');
            if (!empty($this->data)) {
                $this->data['Pliego']['obra_id'] = $obra_id;
                $this->__save_pliego($obra_id, $this->data, $_FILES);
            }
            $referer = $this->referer();
            $this->set(compact('referer'));
            $this->render('add_pliego');
        } else {
            $mensaje = 'Para poder cargar pliegos, primero debe dar de alta una obra de arte en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function view_pliegos() {
        $this->__aux_view_pliegos();
    }

    function admin_view_pliegos() {
        $this->__aux_view_pliegos();
    }

    /**
     * Lista todos los pliegos de la obra que se está dando de alta
     */
    function __aux_view_pliegos() {
        $this->layout = false;
        $obra_id = ($this->Session->check('id_obra')) ? $this->Session->read('id_obra') : 0;
        $obra = $this->Pliego->Obra->findById($obra_id);
        $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

        $this->set('obra_nombre', $obra_nombre);
        $this->set('pliegos', $this->paginate('Pliego', array('Pliego.obra_id' => $obra_id)));
        $this->render('view_pliegos');
    }

    function delete_pliego($id = null) {
        $this->__aux_delete_pliego($id);
    }

    function admin_delete_pliego($id = null) {
        $this->__aux_delete_pliego($id);
    }

    /**
     * Elimina un pliego determinado de la db y su archivo físico correspondiente
     */
    function __aux_delete_pliego($id = null) {
        $this->layout = false;
        $this->Pliego->begin();
        if (!empty($id)) {
            $datos_pliego = $this->Pliego->findById($id, array('recursive' => 0));
            if (!empty($datos_pliego)) {
                if ($this->Pliego->delete($id)) {
                    $pliego_ext = end(explode('.', $datos_pliego['Pliego']['nombre']));
                    $pliego_nombre = $datos_pliego['Pliego']['obra_id'] . '_' . $datos_pliego['Pliego']['id'] . '.' . $pliego_ext;
                    $archivo_pliego = dirname(dirname(__FILE__)) . '\files\pliegos\\' . $pliego_nombre;
                    if (is_file($archivo_pliego)) {
                        if (@unlink($archivo_pliego)) {
                            $this->Pliego->commit();
                            echo 'La pliego "' . $datos_pliego['Pliego']['nombre'] . '" se eliminó correctamente.';
                            exit;
                        } else {
                            // El archivo no se pudo eliminar
                            $this->Pliego->rollback();
                            echo 'Error: El archivo no se pudo eliminar.';
                            exit;
                        }
                    } else {
                        // No se encontró el archivo pero eliminamos igual el pliego de la db
                        $this->Pliego->commit();
                        echo 'El pliego "' . $datos_pliego['Pliego']['nombre'] . '" se eliminó correctamente.';
                        exit;
                    }
                } else {
                    // El pliego no se pudo eliminar de la db
                    $this->Pliego->rollback();
                    echo 'Error: El pliego no se pudo eliminar.';
                    exit;
                }
            } else {
                // No se encontró el pliego en la db
                $this->Pliego->rollback();
                echo 'Error: No se encontró el pliego en la db.';
                exit;
            }
        }
    }

    function edit_pliego($obra_id = null) {
        $this->__aux_edit_pliego($obra_id);
    }

    function admin_edit_pliego($obra_id = null) {
        $this->__aux_edit_pliego($obra_id);
    }

    /**
     * Permite editar un pliego de una obra de arte
     */
    function __aux_edit_pliego($obra_id = null) {
        $this->layout = false;
        if (!empty($this->data)) {
            $obra_id = (isset($this->data['Pliego']['obra_id']) && (!empty($this->data['Pliego']['obra_id']))) ? $this->data['Pliego']['obra_id'] : 0;
            $this->__save_pliego($obra_id, $this->data, $_FILES);
        }
        $referer = $this->referer();
        $this->set(compact('obra_id', 'referer'));
        $this->render('edit_pliego');
    }

    function view_edit_pliegos($obra_id = null) {
        $this->__aux_view_edit_pliegos($obra_id);
    }

    function admin_view_edit_pliegos($obra_id = null) {
        $this->__aux_view_edit_pliegos($obra_id);
    }

    /**
     * Lista todos los pliegos de la obra que se está editando
     */
    function __aux_view_edit_pliegos($obra_id = null) {
        $this->layout = false;
        if (!empty($obra_id)) {
            $obra = $this->Pliego->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

            $this->set('obra_nombre', $obra_nombre);
            $this->set('pliegos', $this->paginate('Pliego', array('Pliego.obra_id' => $obra_id)));
            $this->render('view_edit_pliegos');
        }
    }

    function read_pliego($id = null) {
        $this->__aux_read_pliego($id);
    }

    function admin_read_pliego($id = null) {
        $this->__aux_read_pliego($id);
    }

    /**
     * Recupera un pliego de la db y devuelve su información
     * como un string separado por "|":
     * id|obra_id|nombre|titulo|comentario
     */
    function __aux_read_pliego($id = null) {
        $pliego = '';
        if (!empty($id)) {
            $elemento = $this->Pliego->findById($id, array('recursive' => 0));
            if (!empty($elemento)) {
                $pliego = $elemento['Pliego']['id'] . '|' .
                        $elemento['Pliego']['obra_id'] . '|' .
                        $elemento['Pliego']['nombre'] . '|' .
                        $elemento['Pliego']['titulo'] . '|' .
                        $elemento['Pliego']['comentario'];
            }
        }
        echo $pliego;
        exit;
    }

    function __save_pliego($obra_id = null, $data = null, $files = null) {
        if (!empty($obra_id) && !empty($data)) {
            $this->Pliego->begin();
            if (isset($files['fileUpload']['name']) && !empty($files['fileUpload']['name'])) {
                // Definimos el directorio donde se guarda la pliego
                $dir = dirname(dirname(__FILE__)) . '/files/pliegos/';

                if (!@is_dir($dir)) {
                    if (!@mkdir($dir, 0777)) {
                        $this->Pliego->rollback();
                        echo '<script>parent.resultadoUpload(4);</script> ';
                        exit;
                    }
                }
                $files['fileUpload']['name'] = utf8_encode(strtolower(utf8_decode(trim($files['fileUpload']['name']))));
                $data['Pliego']['nombre'] = $files['fileUpload']['name'];

                //Verifico si el nombre de la pliego ya existe para la misma obra
                if (isset($data['Pliego']['id']) && (!empty($data['Pliego']['id']))) {
                    $pliego_obra = $this->Pliego->find('all', array('conditions' => array('Pliego.id <>' => $data['Pliego']['id'], 'Pliego.obra_id' => $obra_id, 'Pliego.nombre' => $data['Pliego']['nombre'])));
                } else {
                    $pliego_obra = $this->Pliego->find('all', array('conditions' => array('Pliego.obra_id' => $obra_id, 'Pliego.nombre' => $data['Pliego']['nombre'])));
                }
                if (!empty($pliego_obra)) {
                    $this->Pliego->rollback();
                    echo '<script>parent.resultadoUpload(5);</script> ';
                    exit;
                }
            } elseif (isset($data['Pliego']['id']) && (!empty($data['Pliego']['id']))) {
                $pliego = $this->Pliego->findById($data['Pliego']['id']);
                $data['Pliego']['nombre'] = (!empty($pliego)) ? $pliego['Pliego']['nombre'] : '';
            } else {
                $this->Pliego->rollback();
                echo '<script>parent.resultadoUpload(6);</script> ';
                exit;
            }


            $this->Pliego->create();
            if ($this->Pliego->save($data['Pliego'])) {
                $pliego_id = $this->Pliego->id;

                // Intentamos subir la pliego
                // (1) Comprobamos que existe el nombre temporal del archivo
                if (isset($files['fileUpload']['tmp_name']) && !empty($files['fileUpload']['tmp_name'])) {
                    // (2) - Comprobamos que se trata de un archivo de imagen
                    if ($this->__mime_content_type($files['fileUpload']['name'])) {
                        $pliego_ext = end(explode('.', $files['fileUpload']['name']));
                        $pliego_nombre = $obra_id . '_' . $pliego_id . '.' . $pliego_ext;
                        // (3) Por ultimo se intenta copiar el archivo al servidor.
                        if (!copy($files['fileUpload']['tmp_name'], $dir . $pliego_nombre)) {
                            $this->Pliego->rollback();
                            echo '<script>parent.resultadoUpload(1);</script> ';
                            exit;
                        } else {
                            $this->Pliego->commit();
                            echo '<script>parent.resultadoUpload(0);</script> ';
                            exit;
                        }
                    } else {
                        $this->Pliego->rollback();
                        echo '<script>parent.resultadoUpload(2);</script> ';
                        exit;
                    }
                } elseif (isset($data['Pliego']['id']) && (!empty($data['Pliego']['id']))) {
                    $this->Pliego->commit();
                    echo '<script>parent.resultadoUpload(0);</script> ';
                    exit;
                } else {
                    $this->Pliego->rollback();
                    echo '<script>parent.resultadoUpload(3);</script> ';
                    exit;
                }
            } else {
                $this->Pliego->rollback();
                echo '<script>parent.resultadoUpload(1);</script> ';
                exit;
            }
        }
    }

}
?>